'''
@Company: TWL
@Author: xue jian
@Email: xuejian@kanzhun.com
@Date: 2020-07-10 09:57:38
'''
'''
309. 最佳买卖股票时机含冷冻期
给定一个整数数组，其中第 i 个元素代表了第 i 天的股票价格 。​

设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:

你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。
示例:

输入: [1,2,3,0,2]
输出: 3 
解释: 对应的交易状态为: [买入, 卖出, 冷冻期, 买入, 卖出]
'''
'''
tips:dp,两个dp链。dp[i]表示的是以price[i]卖出之后赚的钱。dp_max[i]表示的是截止到prices[i]最多能赚多少钱。
这样就有状态转移方程：
dp[i] = max(dp[i], dp[i-j]+dp_max[i-j-2])
dp_max[i] = max([dp_max[i], dp[i], dp_max[i-1]])
'''

class Solution:
    def maxProfit(self, prices) -> int:
        dp = [0]*(len(prices))
        dp_max = [0]*(len(prices))
        for i in range(1, len(prices)):
            for j in range(1,i+1):
                dp[i] = max(dp[i], prices[i]-prices[i-j])
                
                if i-j>1:
                    dp[i] = max(dp[i], prices[i]-prices[i-j]+dp_max[i-j-2])
            dp_max[i] = max(dp_max[i], dp[i])
            dp_max[i] = max(dp_max[i], dp_max[i-1])
        # print(dp)
        return 0 if not prices else dp_max[-1]

if __name__ == "__main__":
    solution = Solution()
    prices = [1,2,3,0,2]
    print(solution.maxProfit(prices))